Skip to content
[旅するAI bot]AnimateDiffでアニメ効果を追加する
旅するAIbot
note記述記事
2023-12-17

動きがある生成AI絵のツールも少しずつ増えてきました。最初にAnimateDiffの話しをネット記事で見たときに、これを旅botに取り込めないかなと思った話しです。

AnimateDiff

AnimateDiffのネット記事を見つけたのは2023/9頃。Stable-Diffusionでアニメが作れる時代がきたのかと思ってちょっと驚きました。
その頃には旅botは動かしていました。で、旅botに適用できないか調べてみました。
旅botの画像生成にはその頃はstable-diffusion-webuiをAPI呼び出しで使っていた状態です。
stable-diffusion-webui用のanimateDiffプラグインを入れてみていろいろ試してみました。

画像をまるごとimage2image

text2imageしてみる

生成用プログラムもそこそこは書いたものの「うーん、ちょっと微妙かなー」という感じ。最大の問題は、すでに旅bot側のモデルはSDXLに移行済みでしたがこの時点でのAnimateDiffのモデルはStable-Diffusion1.5あたりまででした。生成に使うモデルを別ものにすることになるので感じは似ているものの大分違う出力になります。
text2imageしてrembgしたものを「動きますよー」みたいな感じで出すことも可能と思いましたがやっぱり全然違う感じのキャラで出るとちょっと違うかなと思い、SDXL版のAnimateDiffが出るまで一旦待つ判断にしました。
ただそのときの記事で「AnimateDiffはComfyUIのほうが使いやすいよ」みたいな話しだったので、準備としてStable-Diffusion-webUIからComfyUIの方に移行しておこうかなと考えました。

ComfyUIへの移行

別にStable-Diffusion-webUIに大きな不満はなかったのですが、小さな不満というとありましてカスタマイズが結構面倒という点がありました。

記念写真機能(これもそのうち説明すべきことですね。旅botと記念写真を撮る機能。現在は中止中 https://akibakokoubou.jp/mi-runner/ の記念写真機能の項 )を作るのにControlNet/openPoseを使ったのです。
この際にwebUIにopenPoseのボーン情報をAPIで送ろうとしたときにゴリゴリに書かれたPython+javascriptを読むことになり結構手こずりまして。。
このあたりがComfyUIでシンプルになるのなら新しいツールに移行しておくのもありと思った訳です。

今でもシンプルにAI絵を起こすならwebUIは十分に使いやすいと思いますし、ComfyUIのノード記述は最初に使うなら面食らうと思うので一長一短であるとは思います。
ComfyUIもノードフローを記述したjsonを送るという(なんちゃって感はあるものの)API操作が可能だったし、webUIのときは画像の加工をかなりの部分でnode側で行っていたのですが、慣れれば画像加工という仕事の大半をComfyUI側のノードフローのjsonで書けてるので便利です。
今回ComfyUIでうまく合致するノードが見つからなくてカスタムノードを3つくらい書いたのですが、個々のノードを書く分には書きやすいと思いました。
ただ目的に適合するノードを探すのは結構大変です。実際書いたカスタムノードに相当するものをネットで探したら使えるノードがありましたし。。

ComfyUI
長所: カスタマイズ性高い、ノード書きやすい、一連の画像処理作業をまとめやすい。
短所: 目的に適合するノードを探しにくい(ネットで該当ノードを探すのも、インストール後にメニューから探すのも)

Stable-Video-Diffusion

そういう状態でとりあえずComfyUIへの移行だけ行ってアニメ効果はしばらく忘れて他の部分をごそごそ作っていたのですが、11月にStable-Video-Diffusion( https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt )が発表されて、これ使えるかなと試してみました。

ComfyUIは早速対応していたので試したら、これは入力に画像が使えるけどプロンプトによるテキスト指定は出来ないとのこと。
生成済み画像に対して適用してよしなにアニメ化してくれるのであればそれは助かる話しだけど、プロンプトで操作できないというのはどういうことだろう? デモでは流れる背景はとりあえずかっこいい。
でも試した結果、よい感じで出るケースはあるものの思ったほどにはうまくコントロールできませんでした。

もっともいい感じに出たもの(これが安定に出るなら最強と思った)

大半はアバター絵と背景が乖離してしまう

一番厳しいのは「アバター絵と背景を分離したものとして別々に動いてしまうこと」です。
AIにとってこの絵は「人がいる風景」ではなく「背景+アニメ絵」と明確に認識しているということです。
この認識はGPT-4Vに同様の画像を与えて評価させたときも同じ反応でした。

GPT-4V: この絵は風景写真にアニメの絵を乗せたものです(意訳)

これは合成した画像なのでその判断は「正しい」のです。
ですが、それは全自動判断でアバター絵を「人のように歩かせてくれる」のは、正しい故に困難ということを示しています。。
rembgでアバター絵のみにしてみましたがその場合でも歩いている風に動くこともあるけどこちらも思ったほどには安定しない。
とりあえず現状ままでは旅botのアニメ化にはStable-Video-Diffusionは厳しい という判断にしました。

AnimateDiff再び(SDXL版)

Stable-Video-Diffusionで思い出したようにAnimatedDiffを調べたら、SDXL版が出ているとのこと。
で昔使ったソースも含めて再びAnimateDiffを試してみることに。
ComfyUI用のAnimateDiffをインストール( https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved )し、3晩くらい感触を触って調整。

ComfyUIでのAnimateDiff SDXLをいろいろ試す

こんな感じで動ければとりあえずアリかも と考えて組み込みを開始。

いろいろ試行錯誤

方針が決まれば後はいろいろ試行錯誤しながら組み立てていった訳です。
以下の点を悩んだのですが、個々に説明するとそれだけで記事になる長さなので項目だけ記します。

  1. AnimateDiffをimage2imageで出すかtext2imageで出すか

  2. 背景をどう動かすか

  3. 動きの指示プロンプトをどうするか

  4. X/TwitterやMastodonが出力のwebpをうまく受け付けてくれなかった

  5. 旅botとしてどういうシチュエーションのpostにするか

  6. 会話文章の生成プロンプトをどう作るか

  7. 出力がすごく遅くて(30分~)チューニングに時間がかかりすぎる

カスタムのComfyUIのノードもいくつか作ったけど、それぞれとりあえず解を出して画像を出力出来るようにしました。

開発途中出力

あんまり動きが切り替わるようなリピート感を出したくなかったので動きを抑え気味に変更しました。シチュエーションは「写真を撮ったよー」と姉妹にメッセージを出す感じにして以下の感じにしました。

https://twitter.com/marble_walker/status/1736045020657127629

シチュエーションのテキストは三姉妹夜話に使った擬似会話処理を汎用に改良して生成しました(まだ改良途中ですが)

https://note.com/marble_walkers/n/n227a64e4c3e3

この後

AnimateDiff関係は一旦は一段落です。
ただ細かい改良はごそごそ入れていくと思います。今回AnimateDiffの出力でComfyUIでのimage2imageの出力がよくわからなかったのでtext2imageで出しています。image2imageで出す方法はあるらしいのでそのあたりを調べながら全体的に細かい改良を入れていこうかと思ってます。

(初出 note https://note.com/marble_walkers/n/nffd8ce2a9cb2 )